<?php

namespace app\common\traits;


/**
 * Trait RsaTrait
 * @package app\common\traits
 */
trait RsaTrait
{

	/**
	 * @Notes:生成 sha256WithRSA 签名
	 * 提示：SPKI（subject public key identifier，主题公钥标识符）
	 * @param string $signContent     待签名内容
	 * @param string $privateKey    私钥数据（如果为单行，内容需要去掉RSA的标识符）
	 * @param bool $singleRow       是否为单行私钥-标识
	 * @return string               签名串
	 */
	protected function getSHA256SignWithRSA($signContent = null, $privateKey = '', $singleRow = false)
	{
		if ($singleRow) {
			//如果传入的私钥是单行数据，且没有RSA的标识符，需做格式转化
			$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
				wordwrap($privateKey, 64, "\n", true) .
				"\n-----END RSA PRIVATE KEY-----";
		}
		$key = openssl_get_privatekey($privateKey);
		//开始加密
		openssl_sign($signContent, $signature, $key, OPENSSL_ALGO_SHA256);
		//进行 base64编码 加密后内容
		$encryptedData = base64_encode($signature);
		openssl_free_key($key);
		return $encryptedData;
	}

	/**
	 * @Notes:验证 sha256WithRSA 签名
	 * @param string $signContent     待签名内容
	 * @param string $signatureStr  签名串
	 * @param string $public_key    公钥数据（如果为单行，内容需要去掉RSA的标识符）
	 * @param bool $singleRow       是否为单行私钥-标识
	 * @return int                  1：签名成功，0：签名失败
	 */
	protected function verifySha256SignWithRSA($signContent = null, $signatureStr = '', $public_key = '', $singleRow = false)
	{
		if ($singleRow) {
			$public_key = "-----BEGIN PUBLIC KEY-----\n" .
				wordwrap($public_key, 64, "\n", true) .
				"\n-----END PUBLIC KEY-----";
		}
		$key = openssl_get_publickey($public_key);
		$ok = openssl_verify($signContent, base64_decode($signatureStr), $key, OPENSSL_ALGO_SHA256);
		openssl_free_key($key);
		return $ok;
	}
}
